package com.koron.common.core.business.workflow.bean.po;

import com.koron.common.core.business.workflow.bean.param.BaseParam;
import com.koron.common.core.config.ThreadLocalContext;
import com.koron.common.core.util.CodeTools;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;

/**
 * 工作流表(SysWorkflow)实体类
 *
 * @author jzp
 * @since 2021-04-06 08:47:04
 */
@Data
@ApiModel(value = "工作流表", description = "SysWorkflow")
public class SysWorkflow implements Serializable {

    public SysWorkflow() {
    }

    public SysWorkflow(String dataId) {
        this.billId = CodeTools.getCode32();
        this.dataId = dataId;
    }

    public BaseParam drawBaseParam() {
        return new BaseParam(appCode, setCode, processCode);
    }

    @ApiModelProperty(value = "ID")
    private String id;
    /**
     * ID，和工作流billId关联
     */
    @ApiModelProperty(value = "和工作流billId关联")
    private String billId;
    /**
     * 业务数据ID
     */
    @ApiModelProperty(value = "业务数据ID")
    private String dataId;

    @ApiModelProperty(value = "业务数据编号")
    private String dataCode;

    @ApiModelProperty(value = "业务标题")
    private String dataTitle;

    /**
     * 和工作流taskId关联
     */
    @ApiModelProperty(value = "和工作流taskId关联")
    private String taskId;
    /**
     * 应用编号
     */
    @ApiModelProperty(value = "应用编号")
    private String appCode;
    /**
     * 模板组编号
     */
    @ApiModelProperty(value = "模板组编号")
    private String setCode;
    /**
     * 模板编号
     */
    @ApiModelProperty(value = "模板编号")
    private String processCode;

    /**
     * 流程实例Id
     */
    @ApiModelProperty(value = "流程实例Id")
    private String processInstanceId;
    /**
     * 提交后的当前节点编号（节点编号默认=id,可修改）（流程结束固定等于END,作废等于CANCEL,启动等于START）
     * 多个节点之间不同人员（并行分支）使用;分割
     */
    @ApiModelProperty(value = "提交后的当前节点编号（节点编号默认=id,可修改）（流程结束固定等于END,作废等于CANCEL,启动等于START）")
    private String curNodeCode;
    /**
     * 提交后的当前节点名称
     */
    @ApiModelProperty(value = "提交后的当前节点名称")
    private String curNodeName;
    /**
     * 提交后的当前节点候选人名称
     */
    @ApiModelProperty(value = "提交后的当前节点候选人名称")
    private String curNodeCandidatesName;

    /**
     * 0，流程未结束；1，已结束
     */
    @ApiModelProperty(value = "0，流程未结束；1，已结束")
    private Integer isFinished;

    /**
     * 当前节点处理人id
     * 并行人员使用,分割
     * 会审人员使用&分割
     * 多个节点之间不同人员（并行分支）使用;分割
     */
    @ApiModelProperty(value = "当前节点处理人id")
    private String curNodeUserId;

    /**
     * 当前节点处理人姓名
     */
    @ApiModelProperty(value = "当前节点处理人姓名")
    private String curNodeUserName;

    @ApiModelProperty(value = "上个节点处理人code")
    private String preNodeCode;

    @ApiModelProperty(value = "上个节点处理人姓名")
    private String preNodeName;

    @ApiModelProperty(value = "创建时间")
    private Date createTime;

    @ApiModelProperty(value = "最后修改时间", hidden = true)
    private Date updateTime;

    @ApiModelProperty(value = "模块编码")
    private String moduleCode;

    public String getOneTaskId() {
        String[] split = curNodeUserId.split("&");
        // 有两个及以上人员时，找到对应的taskId
        if (split.length > 1) {
            // 找到当前人的索引位置
            int index = Arrays.asList(split).indexOf(ThreadLocalContext.get().getAccount());
            if (index == -1) {
                return "$^__^$";
                // throw new IllegalArgumentException("当前登陆人未在当前节点处理人队列中");
            }
            return taskId.split("&")[index];
        }
        return taskId;
    }

    public String getTitle() {
        if (dataTitle == null) {
            if (dataCode == null) {
                dataTitle = "业务单号：" + dataId;
            } else {
                dataTitle = "业务单号：" + dataCode;
            }
        }
        return dataTitle;
    }

}
